/**
 * Classe Sommet représentant un sommet.
 */
public class Sommet implements Comparable<Object> {

	private int numero;

	// Attributs pour le calcul de DFS
	private String couleur;	
	private Sommet parent;
	private long decouverte;
	private long finish;

	/**
	 * Constructeur par défaut.
	 */
	public Sommet() {
		super();
	}

	/**
	 * Constructeur de sommet minimal.
	 * @param numero le numéro qui identifie le sommet.
	 */
	public Sommet(int numero) {
		super();
		this.numero = numero;
		this.couleur = "green"; 
		parent = null ;
		decouverte = -1 ;
		finish = -1 ;
	}

	/**
	 * Constructeur de sommet complet.
	 * @param numero le numéro qui identifie le sommet.
	 * @param couleur la couleur du sommet (état).
	 * @param s le sommet parent de ce nouveau sommet.
	 * @param decouverte
	 * @param finish
	 */
	public Sommet(int numero, String couleur, Sommet s, long decouverte, long finish) {
		super();
		this.numero = numero;
		this.couleur = couleur;
		this.parent = s;
		this.decouverte = decouverte;
		this.finish = finish;
	}

	/**
	 * Getteur de l'attribut numero.
	 * @return la valeur de l'attribut numero.
	 */
	public int getNumero() {
		return numero;
	}

	/**
	 * Setteur de l'attribut numero.
	 * @param numero la nouvelle valeur à affecter à l'attribut numero.
	 */
	public void setNumero(int numero) {
		this.numero = numero;
	}

	/**
	 * Getteur de l'attribut couleur.
	 * @return la valeur de l'attribut couleur.
	 */
	public String getCouleur() {
		return couleur;
	}

	/**
	 * Setteur de l'attribut couleur.
	 * @param couleur la nouvelle valeur à affecter à l'attribut couleur.
	 */
	public void setCouleur(String couleur) {
		this.couleur = couleur;
	}

	/**
	 * Getteur de l'attribut parent.
	 * @return la valeur de l'attribut parent.
	 */
	public Sommet getParent() {
		return parent;
	}

	/**
	 * Setteur de l'attribut parent.
	 * @param parent la nouvelle valeur à affecter à l'attribut parent.
	 */
	public void setParent(Sommet parent) {
		this.parent = parent;
	}

	/**
	 * Getteur de l'attribut decouverte.
	 * @return la valeur de l'attribut decouverte.
	 */
	public long getDecouverte() {
		return decouverte;
	}

	/**
	 * Setteur de l'attribut decouverte.
	 * @param decouverte la nouvelle valeur à affecter à l'attribut decouverte.
	 */
	public void setDecouverte(long decouverte) {
		this.decouverte = decouverte;
	}

	/**
	 * Getteur de l'attribut finish.
	 * @return la valeur de l'attribut finish.
	 */
	public long getFinish() {
		return finish;
	}

	/**
	 * Setteur de l'attribut finish.
	 * @param finish la nouvelle valeur à affecter à l'attribut finish.
	 */
	public void setFinish(long finish) {
		this.finish = finish;
	}

	/**
	 * Surcharge de l'opérateur de comparaison.
	 */
	@Override
	public int compareTo(Object o) {
		int s1 = ((Sommet) o).getNumero();
		int s2 = this.getNumero();

		if(s1>s2)
			return -1;
		else{
			if(s1<s2)
				return 1;
			else
				return 0;
		}
	}

	/**
	 * Surcharge de la fonction de génération du hashcode.
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + numero;
		return result;
	}

	/**
	 * Surcharge de la fonction d'équivalence.
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Sommet other = (Sommet) obj;
		if (numero != other.numero)
			return false;
		return true;
	}

	/**
	 * Surcharge de l'opérateur toString.
	 */
	@Override
	public String toString() {
		return numero+"";
	}
	
	public String str() {
		return numero+" ("+couleur+", "+parent+", "+decouverte+", "+finish+")" ;
	}
}
